#include <regx52.h>

// 定义东西方向交通灯引脚
sbit EAST_RED = P2 ^ 0;    // 红灯控制引脚
sbit EAST_GREEN = P2 ^ 1;  // 绿灯控制引脚
sbit EAST_YELLOW = P2 ^ 2; // 黄灯控制引脚

// 定义南北方向交通灯引脚
sbit NORTH_RED = P2 ^ 3;    // 红灯控制引脚
sbit NORTH_GREEN = P2 ^ 4;  // 绿灯控制引脚
sbit NORTH_YELLOW = P2 ^ 5; // 黄灯控制引脚

// 自定义延时函数（单位：ms）
void delay_ms(unsigned int ms)
{
    unsigned int i, j;
    for (i = 0; i < ms; i++)
    {
        for (j = 0; j < 123; j++)
            ; // 12MHz晶振下约1ms延时
    }
}

// 主函数
void main(void)
{
    unsigned char i;
    // 初始化所有灯灭
    P2 = 0xFF;

    while (1)
    { // 无限循环
        // 阶段1：东西方向绿灯，南北方向红灯（主干道通行）
        EAST_GREEN = 0; // 东西绿灯亮
        NORTH_RED = 0;  // 南北红灯亮
        delay_ms(5000);

        // 阶段2：东西方向黄灯闪烁（准备切换），南北方向红灯保持
        EAST_GREEN = 1; // 关闭东西绿灯
        NORTH_RED = 0;  // 保持南北红灯
        for (i = 0; i < 3; i++)
        {
            EAST_YELLOW = 0;
            delay_ms(500);
            EAST_YELLOW = 1;
            delay_ms(500);
        }

        // 阶段3：东西方向红灯，南北方向绿灯（支干道通行）
        EAST_RED = 0;    // 东西红灯亮
        EAST_YELLOW = 1; // 关闭东西黄灯
        NORTH_RED = 1;   // 关闭南北红灯
        NORTH_GREEN = 0; // 南北绿灯亮
        delay_ms(5000);  // 持续5秒（较短通行时间）

        // 阶段4：南北方向黄灯闪烁（准备切换），东西方向红灯保持
        NORTH_GREEN = 1; // 关闭南北绿灯
        EAST_RED = 0;    // 保持东西红灯
        for (i = 0; i < 3; i++)
        {
            NORTH_YELLOW = 0;
            delay_ms(500);
            NORTH_YELLOW = 1;
            delay_ms(500);
        }

        // 准备下次循环（切换前所有红灯亮）
        NORTH_YELLOW = 1; // 关闭南北黄灯
        EAST_RED = 1;     // 关闭东西红灯
    }
}